"""
文件说明：USB2XXX SENT操作相关函数集合
更多帮助：www.toomoss.com
"""
from ctypes import *
import platform
from usb_device import *

# 定义函数返回错误代码
SENT_SUCCESS            = (0)   # 函数执行成功
SENT_ERR_NOT_SUPPORT    = (-1)  # 适配器不支持该函数
SENT_ERR_USB_WRITE_FAIL = (-2)  # USB写数据失败
SENT_ERR_USB_READ_FAIL  = (-3)  # USB读数据失败
SENT_ERR_CMD_FAIL       = (-4)  # 命令执行失败
SENT_ERR_PARAMETER      = (-5)  # 函数参数传入有误
SENT_ERR_MSG_TYPE       = (-6)  # 当前函数不支持该消息类型
# SENT主从模式
SENT_MASTER    = 1    # 主机模式，用于模拟主节点发送数据
SENT_SLAVE     = 0    # 从机模式，用于监控SENT主机发送出来的数据

# SENT消息类型
SENT_MSGTYPE_ERROR        = 0 # 错误帧，比如CRC错误，数据不完整等
SENT_MSGTYPE_FAST         = 1 # 快速通道数据,数据存放在Data[0]~Data[7]里面，Status的高4位代表数据有效半字节数
SENT_MSGTYPE_SLOW_SHORT   = 2 # 慢速通道，简短型串行信息,Data[0]为ID,Data[1]为数据
SENT_MSGTYPE_SLOW_ENH1    = 3 # 慢速通道，增强型串行信息,12位数据+8位ID,Data[0]为ID，Data[1]为高4位数据,Data[2]为低8位数据
SENT_MSGTYPE_SLOW_ENH2    = 4 # 慢速通道，增强型串行信息,16位数据+4位ID,Data[0]为ID，Data[1]为高8位数据,Data[2]为低8位数据

# SENT总线空闲电平
SENT_IDLE_LOW     = 0  # 总线空闲时为高电平，数据输出低电平脉冲
SENT_IDLE_HIGH	  = 1	# 总线空闲时为低电平，数据输出高电平脉冲

# 设置从模式下ID操作模式
class SENT_CONFIG(Structure):
    _fields_ = [
        ("TicksTimeUs",c_ubyte),    #Ticks时间，单位为us，一般为3
        ("MasterMode",c_ubyte),     #0-从机模式，用于监控SENT总线数据，1-主机模式，用于发送SENT总线数据
        ("LowTicks",c_ubyte),       #低电平输出Ticks数，低电平输出时间=TicksTimeUs*LowTicks，推荐设置为5
        ("PausePulseTicks",c_ubyte),#暂停脉冲数，0-不输出，1~64对应12Ticks~768Ticks
        ("NibbleNum",c_ubyte),      #快速通道半字节数，不包含CRC，从机模式若是0则自动匹配，主机模式Status高4位代表要发送的有效半字节数
        ("IdleLevel",c_ubyte),      #总线空闲状态，0-空闲低电平，1-空闲高电平
    ]

# 设置从模式下ID操作模式
class SENT_MSG(Structure):
    _fields_ = [
        ("Timestamp",c_uint),     #接收到信息帧时的时间标识，从SENT控制器初始化开始计时，单位为100us。发送数据时为帧间隔时间，单位为ms
        ("TimestampHigh",c_ubyte),#接收数据时为时间戳高位,发送帧时为该帧发送次数
        ("Status",c_ubyte),       #高4位代表Data有效字节数，低4位代表Status
        ("Data",c_ubyte*8),       #根据帧类型存储不同的数据
        ("crc",c_ubyte),          #MsgType若为增强型串行信息，则是6bit有效CRC，其他的为4bit有效CRC，bit7-当前帧为错误帧
        ("MsgType",c_ubyte),      #帧类型，具体可以参考帧类型定义
    ]
def SENT_Init(DevHandle,Channel,pConfig):
    return USB2XXXLib.SENT_Init(DevHandle,Channel,pConfig)

def SENT_SendMsg(DevHandle, Channel, pSentMsg,MsgNum):
    return USB2XXXLib.SENT_SendMsg(DevHandle, Channel, pSentMsg,MsgNum)

def SENT_StartFastMsgTable(DevHandle,Channel,pSentMsg,MsgNum,SendTimes):
    return USB2XXXLib.SENT_StartFastMsgTable(DevHandle,Channel,pSentMsg,MsgNum,SendTimes)

def SENT_StopFastMsgTable(DevHandle,Channel):
    return USB2XXXLib.SENT_StopFastMsgTable(DevHandle,Channel)

def SENT_StartSlowMsgTable(DevHandle,Channel,pSentMsg,MsgNum,SendTimes):
    return USB2XXXLib.SENT_StartSlowMsgTable(DevHandle,Channel,pSentMsg,MsgNum,SendTimes)

def SENT_StopSlowMsgTable(DevHandle,Channel):
    return USB2XXXLib.SENT_StopSlowMsgTable(DevHandle,Channel)

def SENT_GetMsg(DevHandle,Channel,pSentMsg):
    return USB2XXXLib.SENT_GetMsg(DevHandle,Channel,pSentMsg)

def SENT_GetStartTime(DevHandle,Channel):
    return USB2XXXLib.SENT_GetStartTime(DevHandle,Channel)

def SENT_ResetStartTime(DevHandle,Channel):
    return USB2XXXLib.SENT_ResetStartTime(DevHandle,Channel)

